# coding=utf-8
import re
from flask import Flask, request, current_app, g, jsonify, session

from . import api
from aihome.utils.response_code import RET
from aihome.models import User
from aihome.utils.commons import login_required
from aihome import db
from aihome.utils.image_storage import storage
from aihome.constants import QINIU_DOMIN_PREFIX


@api.route('/sessions', methods=['POST'])
def login():
    print 'hhh'
    """
    登录
    1.获取json数据
    2.判断json数据是否存在
    3.获取手机号，密码
    4.检验参数是否完整
    5.检查手机号格式
    6.检查用户是否是注册用户
    7.检查密码是否正确
    8.保存session
    9.返回结果
    """
    # 获取json数据
    user_data = request.get_json()
    # json数据是否存在
    if not user_data:
        return jsonify(errno=RET.DBERR, errmsg='没有json数据')
    # 获取参数
    mobile = user_data.get('mobile')
    password = user_data.get('password')
    print mobile
    # 校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.DBERR, errmsg='参数缺失')
    # 判断手机格式
    if not re.match(r'^1[3-9]\d{9}', mobile):
        return jsonify(errno=RET.DBERR, errmsg='手机号码格式错误')
    # 查询用户
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        # 记录错误日志信息
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
    # 判断用户名或密码是否错误
    if (user is None) or not (user.check_password(password)):
        return jsonify(errno=RET.DBERR, errmsg='用户名或密码错误')
    # 写入session
    session['user_id'] = user.id
    session['mobile'] = mobile
    session['name'] = user.name
    return jsonify(errno=RET.OK, errmsg='Ok')


@api.route('/session', methods=['GET'])
def check_user_login():
    """
    检查用户登录状态
    1.从sesion中获取用户名
    2.判断是否存在用户名
    3.返回数据
    :return:
    """
    # 使用session对象获取用户名
    name = session.get('name')
    # 判断获取结果,如果用户已经登陆,返回用户名
    if name:
        return jsonify(errno=RET.OK,errmsg='true',data={'name':name})
    # 否则返回false
    else:
        return jsonify(errno=RET.SESSIONERR,errmsg='false')


@api.route('/session', methods=['DELETE'])
@login_required
def logout():
    """
    退出登录
    :return:
    """
    # 清除session
    session['user_id'] = None
    session['mobile'] = None
    session['name'] = None

    return jsonify(errno=RET.OK, errmsg='OK')


@api.route('/user', methods=['GET'])
@login_required
def get_user_profile():
    """
    查询用户个人信息
    1.获取用户身份user_id
    2.查询用户信息
    3.返回给前端
    :return:
    """
    # 获取用户身份id
    user_id = g.user_id
    # 查询用户信息
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
    # 判断是否查到
    if not user:
        return jsonify(errno=RET.DBERR, errmsg='没有查到用户数据')
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK', data=user.to_dict())


@api.route('/user/name', methods=['PUT'])
@login_required
def change_user_profile():
    """
       修改用户信息
    1/获取用户身份
    2/获取参数,put请求里的json数据,request.get_json()
    3/判断获取结果是否有数据
    4/获取详细的参数信息,name
    5/查询数据库,执行update更新用户信息
    User.query.filter_by(id=user_id).update({'name':name})
    db.session.commit()
    6/更新缓存中的用户信息
    session['name'] = name
    7/返回结果
    :return:
    """
    # 获取用户id
    user_id = g.user_id
    # 获取json数据
    user_data = request.get_json()
    # 判断json数据是否存在
    if not user_data:
        return jsonify(errno=RET.DBERR, errmsg='没有查到用户数据')
    # 查询用户信息
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
    if not user:
        return jsonify(errno=RET.DBERR, errmsg='没有查到用户数据')
    # 获取要修改的name
    name = user_data.get('name')
    user.name = name
    # 更新用户name
    try:
        User.query.filter_by(id=user_id).update({'name':name})
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        # 发生异常，进行回滚
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='更新用户信息时数据库异常')
    # 更新缓存数据
    session['name'] = name
    return jsonify(errno=RET.OK, errmsg='OK', data={'name':name})


@api.route('/user/avatar', methods=['POST'])
@login_required
def set_user_avatar():
    """
    修改头像
    1.获取用户id，
    2.获取头像图片对象
    3.查询用户
    3.读取图片内容
    4.调用七牛云上传
    5.返回图片url
    :return:
    """
    # 获取用户id
    user_id = g.user_id
    # 获取图片对象
    avatar = request.files.get('avatar')
    if not avatar:
        return jsonify(errno=RET.DBERR, errmsg='没有avatar')
    # 查询用户
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
    if not user:
        return jsonify(errno=RET.DBERR, errmsg='没有查询到用户数据')
    # 读取avatar
    avatar_data = avatar.read()
    # 调用七牛云保存图片
    try:
        avatar_url = storage(avatar_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='上传七牛云异常')
    # 保存图片相对路径
    try:
        User.query.filter_by(id=user_id).update({'avatar_url':avatar_url})
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        # 异常回滚
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='更新用户头像路径数据库异常')
    # 拼接图片绝对路径
    avatar_url = QINIU_DOMIN_PREFIX + avatar_url
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK', data={'avatar_url': avatar_url})



@api.route('/user/auth', methods=['GET', 'POST'])
@login_required
def set_user_auth():
    """
    1.获取用户id
    2.获取json数据
    3.获取参数
    4.校验参数
    5.保存用户实名认证信息,确保实名认证只能执行一次
    6.返回结果
    :return:
    """
    if request.method == 'GET':
        # 获取用户id
        user_id = g.user_id
        # 查询用户
        try:
            user = User.query.filter_by(id=user_id).first()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
        if not user:
            return jsonify(errno=RET.DBERR, errmsg='没有查询到用户数据')
        id_card = user.id_card
        real_name = user.real_name
        return jsonify(errno=RET.OK, errmsg='OK', data={'real_name': real_name, 'id_card': id_card})
    else:
        # 获取用户id
        user_id = g.user_id
        # 获取json数据
        user_data = request.get_json()
        if not user_data:
            return jsonify(errno=RET.DBERR, errmsg='没有json数据')
        # 获取参数
        id_card = user_data.get('id_card')
        real_name = user_data.get('real_name')
        # 校验参数
        if not all([id_card, real_name]):
            return jsonify(errno=RET.DBERR, errmsg='参数缺失')
        # 查询用户
        try:
            user = User.query.filter_by(id=user_id).first()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='查询用户信息时数据库异常')
        if not user:
            return jsonify(errno=RET.DBERR, errmsg='没有查询到用户数据')
        # 保存到数据库
        try:
            User.query.filter_by(id=user_id, real_name=None, id_card=None).update({'id_card': id_card, 'real_name': real_name})
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg='保存用户实名认证时数据库异常')
        return jsonify(errno=RET.OK, errmsg='OK')



